package oracle;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/** 版本1--封装【拓展】
 * Mysql工具类
 * 1.数据库：地址、用户名、密码  私有属性--静态化【本类直接调用】
 * Oracle与Mysql同时具备--地址、用户名、密码
 * 2.静态方法【本类直接调用】getParam(String 外置文件路径)
 *  目的：使用方法调用外部文件  db_mysql.properties
 *   db_mysql.properties  对应  Java Properties类：读取键值对形式信息
 *   Properties类 提供方法  load() 读取配置文件信息【键值对-数据库基本信息】
 * 3.通过封装概念--链接成功数据库【通用一个类链接Mysql和Oracle】
 */
public class Mysql {
    //1.任何数据库具备：地址、用户名、密码---私有静态属性
    private static String url;
    private static String username;
    private static String password;
    //2.静态方法:getParam(String 路径)---链接数据库--读取信息
    //2.1 配置文件：键值对出现，保存数据库对应的基本信息  xxx.properties
    public static void getParam(String fileName) throws IOException {
        //2.2 Properties类--读取xxx.properties配置文件信息
        Properties p=new Properties();
        //2.3 外置文件读取---借助IO---搬运数据---InputStream
        //Mysql.class 表示当前 Mysql类的Class对象
        //理解：图书馆--区域存Mysql相关书籍
        //getClassLoader() 获取当前类的加载器【加载器负责读取配置文件信息】
        //理解：图书馆--区域存Mysql相关书籍----图书管理员
        //getResourceAsStream(文件) 获取当前加载器中键值对信息
        //理解：图书馆--区域存Mysql相关书籍----图书管理员---拿明确的书籍
        InputStream fis=
                Mysql.class.getClassLoader().getResourceAsStream(fileName);
        p.load(fis);
        //2.4 读取数据库基本信息【url、用户、密码】赋值给当前对象【url、用户、密码】
        //Properties类--提供方法 getProperty()读取db_mysql.properties中键
        url=p.getProperty("url");
        username=p.getProperty("username");
        password=p.getProperty("password");
        System.out.println("测试链接成功："+url+username+password);
    }

    public static void main(String[] args) throws IOException {
        //测试封装概念--链接成功数据库
        Mysql.getParam("db_mysql.properties");
    }
}

import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;
public class MysqlInsertDemo {
    public static void main(String[] args) {
        try {
            // 1. 加载配置（和测试代码一致）
            Mysql.getParam("db_mysql.properties");

            // 2. 获取数据库连接
            Connection conn = Mysql.getConnection();

            // 3. 编写插入 SQL（假设 book 表有 name、author 字段）
            String sql = "INSERT INTO book(name, author) VALUES (?, ?)";

            // 4. 创建预编译语句（防 SQL 注入）
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "Java 编程思想");  // 填充第一个参数
            pstmt.setString(2, "Bruce Eckel");   // 填充第二个参数

            // 5. 执行插入，返回影响行数
            int affectedRows = pstmt.executeUpdate();
            System.out.println("插入成功，影响行数：" + affectedRows);

            // 6. 关闭资源（顺序：后开先关）
            pstmt.close();
            conn.close();
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }
}

public class OracleUtil {
    private static String url;
    private static String username;
    private static String password;
    private static String driver;

    // 静态方法：获取配置文件中的数据库连接信息
    public static void getParam(String fileName) throws IOException {
        Properties p = new Properties();
        // 通过类加载器获取配置文件输入流
        InputStream fis = OracleUtil.class.getClassLoader().getResourceAsStream(fileName);
        p.load(fis);
        // 读取配置文件中的键值对并赋值
        url = p.getProperty("url");
        username = p.getProperty("username");
        password = p.getProperty("password");
        driver = p.getProperty("driver");
    }

    // 获取数据库连接
    public static Connection getConnection() {
        Connection conn = null;
        try {
            // 加载 Oracle JDBC 驱动
            Class.forName(driver);
            // 创建数据库连接
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
}